package cl.zeke.cursos.jsf2spring3jpa2.negocio.entities;

import cl.zeke.java.commons.beansvalidators.annotations.Email;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Past;

@Entity
@Table(name="persona")
@NamedQueries({
    @NamedQuery(name="Persona.traerTodasConMascota",
        query="select distinct p from Persona p "
        + "left join fetch p.mascotaList m "
        + "left join fetch m.tipoMascota tm "
        + "order by p.nombre asc, m.nombre asc"),
    @NamedQuery(name="Persona.traerTodos", 
        query="select p from Persona p "
        + "order by p.nombre asc"),
    @NamedQuery(name="Persona.traerPorNombre", 
        query="select p from Persona p "
        + "where p.nombre = :nombre "
        + "order by p.nombre asc"),
    @NamedQuery(name="Persona.traerPorRut", 
        query="select p from Persona p "
        + "where p.rut = :rut")
})
public class Persona implements Serializable {

    @Id
    @Column(name="rut")
    private Integer rut;
    
    @Column(name="nombre")
    private String nombre;
    
    @Column(name="password")
    private String password;
    
    @Past
    @Temporal(TemporalType.DATE)
    @Column(name="fecha_nacimiento")
    private Date fechaNacimiento;
    
    @Email
    private String email;
    
    @OneToMany(mappedBy="persona", fetch= FetchType.LAZY, cascade= CascadeType.ALL, orphanRemoval=true)
    private List<Mascota> mascotaList;

    public Integer getRut() {
        return rut;
    }

    public void setRut(Integer rut) {
        this.rut = rut;
    }

    public List<Mascota> getMascotaList() {
        return mascotaList;
    }

    public void setMascotaList(List<Mascota> mascotaList) {
        this.mascotaList = mascotaList;
    }
    
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }
    
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 19 * hash + (this.rut != null ? this.rut.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Persona other = (Persona) obj;
        if (this.rut != other.rut && (this.rut == null || !this.rut.equals(other.rut))) {
            return false;
        }
        return true;
    }
    
}